home *** CD-ROM | disk | FTP | other *** search
/ Pascal Super Library / Pascal Super Library (CW International)(1997).bin / LIBRARY / PAS_0793 / VOCTOOL.PAS < prev    next >
Pascal/Delphi Source File  |  1993-08-01  |  11KB  |  471 lines

  1. {─ Fido Pascal Conference ────────────────────────────────────────────── PASCAL ─
  2. Msg  : 377 of 394                                                               
  3. From : Laurent Chartinier                  2:325/1.0            30 Jun 93  14:22 
  4. To   : Dustin Nulf                                                               
  5. Subj : .voc Soundblaster     1/5                                              
  6. ────────────────────────────────────────────────────────────────────────────────
  7. Laurent M.CHARTINIER wrote to Dustin NULF
  8.  
  9. DN>Does anyone know where I can find some Soundblaster pascal source that will
  10. DN>let me read in .VOC files?  I have something called TPSBK100.ZIP, but I can'
  11. DN>get it to work...(supposively the wrong DMA channel, or something to do with
  12. DN>the hardware that I can't figure out).  Any help
  13. DN>would be greatly appreciated!  Thanks in advance...
  14.  
  15. I find a unit to work with CreativeLabs VOC file :}
  16.  
  17.  
  18. UNIT VOCTOOL;
  19. {
  20.  ********************************************************************
  21.  ********************************************************************
  22.  
  23. }
  24. INTERFACE
  25.  
  26. TYPE
  27.    VOCFileTyp = File;
  28.  
  29. CONST
  30.    VOCToolVersion  = 'v1.5';  { Num of version unit VOCTOOL }
  31.    VOCBreakEnd     = 0;       { Loop Interrupt constant }
  32.    VOCBreakNow     = 1;       { Loop Interrupt constant }
  33.  
  34. VAR
  35.    VOCStatusWord        : WORD;   { Sound-Blaster-Status  }
  36.    VOCErrStat           : WORD;   { Nº error driver }
  37.    VOCFileHeader        : STRING; { CreativeLabs Header = CT}
  38.    VOCFileHeaderLength  : BYTE;     { Length of Header CT }
  39.    VOCPaused            : BOOLEAN;  { Flag Voice-Pause    }
  40.    VOCDriverInstalled   : BOOLEAN;  { Flag Driver Ok      }
  41.    VOCDriverVersion     : WORD;     { Num of version of Driver     }
  42.    VOCPtrToDriver       : Pointer;  { Pointer on Driver in memory }
  43.    OldExitProc          : Pointer;  { Pointer on old Unit-ExitProc }
  44.  
  45.  
  46. PROCEDURE PrintVOCErrMessage;
  47. FUNCTION  VOCGetBuffer(VAR VoiceBuff : Pointer; Voicefile : STRING):BOOLEAN;
  48. FUNCTION  VOCFreeBuffer(VAR VoiceBuff : Pointer):BOOLEAN;
  49. FUNCTION  VOCGetVersion:WORD;
  50. PROCEDURE VOCSetPort(PortNumber : WORD);
  51. PROCEDURE VOCSetIRQ(IRQNumber : WORD);
  52. FUNCTION  VOCInitDriver:BOOLEAN;
  53. PROCEDURE VOCDeInstallDriver;
  54. PROCEDURE VOCSetSpeaker(OnOff:BOOLEAN);
  55. PROCEDURE VOCOutput(BufferAddress : Pointer);
  56. PROCEDURE VOCOutputLoop (BufferAddress : Pointer);
  57. PROCEDURE VOCStop;
  58. PROCEDURE VOCPause;
  59. PROCEDURE VOCContinue;
  60. PROCEDURE VOCBreakLoop(BreakMode : WORD);
  61.  
  62. IMPLEMENTATION
  63.  
  64. USES DOS,Crt;
  65.  
  66. TYPE
  67.    TypeCastType = ARRAY [0..6000] of Char;
  68.  
  69. VAR
  70.    Regs : Registers;
  71.  
  72. PROCEDURE PrintVOCErrMessage;
  73. {
  74. }
  75. BEGIN
  76.    CASE VOCErrStat OF
  77.       100 : Write(' Driver CT-VOICE.DRV not find ');
  78.       110 : Write(' Not enougth memory for driver ');
  79.       120 : Write(' Bad Driver ');
  80.  
  81.       200 : Write(' Voc File not found ');
  82.       210 : Write(' Not enougth memory for VOC file ');
  83.       220 : Write(' This file is not a VOC file ');
  84.  
  85.       300 : Write(' Implementation Memory Error ');
  86.  
  87.       400 : Write(' Sound Blaster Card not found ');
  88.       410 : Write(' Bad Port Address ');
  89.       420 : Write(' Interrupt not valid ');
  90.  
  91.       500 : Write(' No run in time ');
  92.       510 : Write(' No Data works actually ');
  93.       520 : Write(' No Data Stopped ');
  94.       END;
  95.    END;
  96.  
  97. FUNCTION Exists (Filename : STRING):BOOLEAN;
  98. {
  99. }
  100. VAR
  101.    F : File;
  102. BEGIN
  103.    Assign(F,Filename);
  104. {$I-}
  105.    Reset(F);
  106.    Close(F);
  107. {$I+}
  108.    Exists := (IoResult = 0) AND (Filename <> '');
  109.    END;
  110.  
  111. PROCEDURE AllocateMem (VAR Pt : Pointer; Size : LongInt);
  112. {
  113.  
  114. }
  115. VAR
  116.    SizeIntern : WORD;
  117. BEGIN
  118.    Inc(Size,15);
  119.    SizeIntern := (Size shr 4);
  120.    Regs.AH := $48;
  121.    Regs.BX := SizeIntern;
  122.    MsDos(Regs);
  123.    IF (Regs.BX <> SizeIntern) THEN Pt := NIL
  124.    ELSE Pt := Ptr(Regs.AX,0);
  125. END;
  126.  
  127. FUNCTION  CheckFreeMem (VAR VoiceBuff : Pointer; VoiceSize : LongInt):BOOLEAN;
  128. BEGIN
  129.    AllocateMem(VoiceBuff,VoiceSize);
  130.    CheckFreeMem := VoiceBuff <> NIL;
  131.    END;
  132.  
  133. FUNCTION  VOCGetBuffer (VAR VoiceBuff : Pointer; Voicefile : STRING):BOOLEAN;
  134. {
  135. }
  136. VAR
  137.    SampleSize : LongInt;
  138.    FPresent   : BOOLEAN;
  139.    VFile      : VOCFileTyp;
  140.    Segs       : WORD;
  141.    Read       : WORD;
  142.  
  143. BEGIN
  144.    FPresent := Exists(VoiceFile);
  145.  
  146. { VOC File not found }
  147.    IF Not(FPresent) THEN BEGIN
  148.       VOCGetBuffer := FALSE;
  149.       VOCErrStat   := 200;
  150.       EXIT
  151.       END;
  152.  
  153.    Assign(VFile,Voicefile);
  154.    Reset(VFile,1);
  155.    SampleSize := Filesize(VFile);
  156.    AllocateMem(VoiceBuff,SampleSize);
  157.  
  158. { Not enougth memory for VOC file }
  159.    IF (VoiceBuff = NIL) THEN BEGIN
  160.       Close(VFile);
  161.       VOCGetBuffer := FALSE;
  162.       VOCErrStat   := 210;
  163.       EXIT;
  164.       END;
  165.  
  166.    Segs := 0;
  167.    REPEAT
  168.       Blockread(VFile,Ptr(seg(VoiceBuff^)+4096*Segs,Ofs(VoiceBuff^))^,$FFFF,Rea
  169.       Inc(Segs);
  170.       UNTIL Read = 0;
  171.    Close(VFile);
  172.  
  173. { Le fichier n'est pas au format VOC }
  174.    IF (TypeCastType(VoiceBuff^)[0]<>'C') OR
  175.       (TypeCastType(VoiceBuff^)[1]<>'r') THEN BEGIN
  176.       VOCGetBuffer := FALSE;
  177.       VOCErrStat := 220;
  178.       EXIT;
  179.       END;
  180.  
  181. { Load Ok }
  182.    VOCGetBuffer := TRUE;
  183.    VOCErrStat   := 0;
  184.  
  185. { Read Length Header }
  186.    VOCFileHeaderLength := Ord(TypeCastType(VoiceBuff^)[20]);
  187.    END;
  188.  
  189. FUNCTION VOCFreeBuffer (VAR VoiceBuff : Pointer):BOOLEAN;
  190. {
  191. }
  192. BEGIN
  193.    Regs.AH := $49;
  194.    Regs.ES := seg(VoiceBuff^);
  195.    MsDos(Regs);
  196.    VOCFreeBuffer := TRUE;
  197.    IF (Regs.AX = 7) OR (Regs.AX = 9) THEN BEGIN
  198.       VOCFreeBuffer := FALSE;
  199.       END;
  200.    END;
  201.  
  202. FUNCTION VOCGetVersion:WORD;
  203. {
  204. }
  205. VAR
  206.    VDummy : WORD;
  207. BEGIN
  208.    ASM
  209.       MOV       BX,0
  210.       CALL      VOCPtrToDriver
  211.       MOV       VDummy, AX
  212.       END;
  213.    VOCGetVersion := VDummy;
  214.    END;
  215.  
  216. PROCEDURE VOCSetPort(PortNumber : WORD);
  217. {
  218. }
  219. BEGIN
  220.    ASM
  221.       MOV    BX,1
  222.       MOV    AX,PortNumber
  223.       CALL   VOCPtrToDriver
  224.       END;
  225.    END;
  226.  
  227. PROCEDURE VOCSetIRQ(IRQNumber : WORD);
  228. {
  229. }
  230. BEGIN
  231.    ASM
  232.       MOV    BX,2
  233.       MOV    AX,IRQNumber
  234.       CALL   VOCPtrToDriver
  235.       END;
  236.    END;
  237.  
  238. FUNCTION  VOCInitDriver: BOOLEAN;
  239. {
  240. }
  241. VAR
  242.    Out, VSeg, VOfs : WORD;
  243.    F   : File;
  244.    Drivername,
  245.    Pdir        : DirStr;
  246.    Pnam        : NameStr;
  247.    Pext        : ExtStr;
  248.  
  249. BEGIN
  250.    Pdir := ParamStr(0);
  251.    Fsplit(ParamStr(0),Pdir,Pnam,Pext);
  252.    Drivername := Pdir+'CT-VOICE.DRV';
  253.  
  254.    VOCInitDriver := TRUE;
  255.  
  256. { Driver not found }
  257.    IF Not Exists(Drivername) THEN BEGIN
  258.       VOCInitDriver := FALSE;
  259.       VOCErrStat    := 100;
  260.       EXIT;
  261.       END;
  262. { Loading of  driver }
  263.    Assign(F,Drivername);
  264.    Reset(F,1);
  265.    AllocateMem(VOCPtrToDriver,Filesize(F));
  266.  
  267. { Not enougth memory for driver }
  268.  
  269.    IF VOCPtrToDriver = NIL THEN BEGIN
  270.       VOCInitDriver := FALSE;
  271.       VOCErrStat    := 110;
  272.       EXIT;
  273.       END;
  274.  
  275.    Blockread(F,VOCPtrToDriver^,Filesize(F));
  276.    Close(F);
  277.  
  278. { Bad Driver, don't begin by "CT" }
  279.  
  280.    IF (TypeCastType(VOCPtrToDriver^)[3]<>'C') OR
  281.       (TypeCastType(VOCPtrToDriver^)[4]<>'T') THEN BEGIN
  282.          VOCInitDriver := FALSE;
  283.          VOCErrStat    := 120;
  284.          EXIT;
  285.          END;
  286.  
  287. { Return Number of Version }
  288.    VOCDriverVersion := VOCGetVersion;
  289.  
  290. { Start Driver }
  291.    Vseg := Seg(VOCStatusWord);
  292.    VOfs := Ofs(VOCStatusWord);
  293.    ASM
  294.       MOV       BX,3
  295.       CALL      VOCPtrToDriver
  296.       MOV       Out,AX
  297.       MOV       BX,5
  298.       MOV       ES,VSeg
  299.       MOV       DI,VOfs
  300.       CALL      VOCPtrToDriver
  301.       END;
  302.  
  303. { Sound Blaster card not found  }
  304.    IF Out = 1 THEN BEGIN
  305.       VOCInitDriver := FALSE;
  306.       VOCErrStat    := 400;
  307.       EXIT;
  308.       END;
  309.  
  310. { Bad address port }
  311.    IF Out = 2 THEN BEGIN
  312.       VOCInitDriver := FALSE;
  313.       VOCErrStat    := 410;
  314.       EXIT;
  315.       END;
  316.  
  317. { Bad Interrupt Number }
  318.    IF Out = 3 THEN BEGIN
  319.       VOCInitDriver := FALSE;
  320.       VOCErrStat    := 420;
  321.       EXIT;
  322.       END;
  323.  
  324.    END;
  325.  
  326. PROCEDURE VOCDeInstallDriver;
  327. {
  328. }
  329. VAR
  330.    Check : BOOLEAN;
  331. BEGIN
  332.    IF VOCDriverInstalled THEN
  333.    ASM
  334.       MOV       BX,9
  335.       CALL      VOCPtrToDriver
  336.       END;
  337.    Check := VOCFreeBuffer(VOCPtrToDriver);
  338.    END;
  339.  
  340. PROCEDURE VOCSetSpeaker(OnOff:BOOLEAN);
  341. {
  342. }
  343. VAR
  344.    Switch : BYTE;
  345. BEGIN
  346.    Switch := Ord(OnOff) AND $01;
  347.    ASM
  348.       MOV       BX,4
  349.       MOV       AL,Switch
  350.       CALL      VOCPtrToDriver
  351.       END;
  352.    END;
  353.  
  354. PROCEDURE VOCOutput (BufferAddress : Pointer);
  355. {
  356. }
  357. VAR
  358.    VSeg, VOfs : WORD;
  359. BEGIN
  360.    VOCSetSpeaker(TRUE);
  361.    VSeg := Seg(BufferAddress^);
  362.    VOfs := Ofs(BufferAddress^)+VOCFileHeaderLength;
  363.    ASM
  364.       MOV       BX,6
  365.       MOV       ES,VSeg
  366.       MOV       DI,VOfs
  367.       CALL      VOCPtrToDriver
  368.       END;
  369.    END;
  370.  
  371. PROCEDURE VOCOutputLoop (BufferAddress : Pointer);
  372. VAR
  373.    VSeg, VOfs : WORD;
  374. BEGIN
  375.    VSeg := Seg(BufferAddress^);
  376.    VOfs := Ofs(BufferAddress^)+VOCFileHeaderLength;
  377.    ASM
  378.       MOV       BX,6
  379.       MOV       ES,VSeg
  380.       MOV       DI,VOfs
  381.       CALL      VOCPtrToDriver
  382.       END;
  383.    END;
  384.  
  385. PROCEDURE VOCStop;
  386. {
  387. }
  388. BEGIN
  389.    ASM
  390.       MOV       BX,8
  391.       CALL      VOCPtrToDriver
  392.       END;
  393.    END;
  394.  
  395. PROCEDURE VOCPause;
  396. {
  397. }
  398. VAR
  399.    Switch : WORD;
  400. BEGIN
  401.    VOCPaused := TRUE;
  402.    ASM
  403.       MOV       BX,10
  404.       CALL      VOCPtrToDriver
  405.       MOV       Switch,AX
  406.       END;
  407.    IF (Switch = 1) THEN BEGIN
  408.       VOCPaused := FALSE;
  409.       VOCErrStat := 510;
  410.       END;
  411.    END;
  412.  
  413. PROCEDURE VOCContinue;
  414. {
  415. }
  416. VAR
  417.    Switch : WORD;
  418. BEGIN
  419.    ASM
  420.       MOV       BX,11
  421.       CALL      VOCPtrToDriver
  422.       MOV       Switch,AX
  423.       END;
  424.    IF (Switch = 1) THEN BEGIN
  425.       VOCPaused := FALSE;
  426.       VOCErrStat := 520;
  427.       END;
  428.    END;
  429.  
  430. PROCEDURE VOCBreakLoop(BreakMode : WORD);
  431. {
  432. }
  433. BEGIN
  434.    ASM
  435.       MOV       BX,12
  436.       MOV       AX,BreakMode
  437.       CALL      VOCPtrToDriver
  438.       MOV       BreakMode,AX
  439.       END;
  440.    IF (BreakMode = 1) THEN VOCErrStat := 500;
  441.    END;
  442.  
  443. {$F+}
  444. PROCEDURE VoiceToolsExitProc;
  445. {$F-}
  446. {
  447.               installé à la fin du programme
  448. }
  449. BEGIN
  450.    VOCDeInstallDriver;
  451.    ExitProc := OldExitProc;
  452.    END;
  453.  
  454. BEGIN
  455. {
  456. }
  457. { Change old ExitProc on newer Tool-Unit }
  458.    OldExitProc := ExitProc;
  459.    ExitProc := @VoiceToolsExitProc;
  460. { Init basic value }
  461.    VOCStatusWord := 0;
  462.    VOCErrStat    := 0;
  463.    VOCPaused     := FALSE;
  464.    VOCFileHeaderLength := $1A;
  465.    VOCFileHeader :=
  466.       'Creative Voice File'+#$1A+#$1A+#$00+#$0A+#$01+#$29+#$11+#$01;
  467. {
  468.  
  469. }
  470.    VOCDriverInstalled := VOCInitDriver;
  471. END.